package com.xxxx.server.service.impl;

import com.xxxx.server.pojo.Admin;
import com.xxxx.server.pojo.Menu;
import com.xxxx.server.mapper.MenuMapper;
import com.xxxx.server.service.IMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.jsonwebtoken.lang.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author huyelin
 * @since 2022-01-12
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 通过用户id查询菜单列表
     * @return
     * 为什么把菜单数据放入缓存中呢？
     *  因为菜单是一个热数据。每个用户登录网页后，都一定获取菜单数据。
     *  放入缓存当中以后，可以减少对数据库的访问。从而减少数据库的压力。
     */
    @Override
    public List<Menu> getMenusByAdminId() {
        /*此时要传admin的id了，那么如何获取呢？
        * 获取当前登录的用户的Id  -----》也就是admin表中的id号
        *
         * 那么：如何从后端获取id呢？
         * springSecurity 会生成全局对象，只要登录后会一直存在。
         * 通过全局对象获取到用户id。
        * */
        // 获取当前登录用户的id=(权限上下文的持有人.获取上下文.获取权限列表.获取主要的信息).获取id
        Integer adminId = ((Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
        // redis中，创建字符串的模板
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //第一步： 从redis中获取菜单数据
        List<Menu> menus = (List<Menu>) valueOperations.get("menu_" + adminId);
        //第二步：从redis中有没有获取到数据：
        if(Collections.isEmpty(menus)){
            // 先从数据库中获取数据库
            menus = menuMapper.getMenusByAdminId(adminId);
            // 然后再把数据放到redis中
            valueOperations.set("menu_"+adminId,menus);
        }
        return menus;
    }
    /**
     * 根据角色获取菜单列表
     */
    @Override
    public List<Menu> getMenusWithRole() {
        return menuMapper.getMenusWithRole();
    }

    @Override
    public List<Menu> getAllMenus() {
        return menuMapper.getAllMenus();
    }
}
